import { promisify, request } from './promisify';

// 是否登录开发者服务端
let isDeveloperServerLogin = false;
// 是否登录抖音主端
let isDouyinLogin = false;

class LoginController {
  _token = '';
  _openid = '';
  _userId = '';

  /**
   * @description: 登录函数，首先调用tt.login获取code，并向开发者服务端请求登录
   * @param {*} force 当用户未登录抖音app时，是否强制调起抖音app登录界面
   * @return {*}
   */
  async login(force = true) {
    if (isDeveloperServerLogin) {
      return true;
    }
    
    // 检查是否在抖音小程序环境中
    if (typeof tt === 'undefined') {
      console.log('不在抖音小程序环境中，无法执行登录');
      return false;
    }
    
    let loginData = null;
    try {
      // 是否强制调起抖音的登录窗口
      loginData = await promisify(tt.login, { force });
      // 调试：打印 code 方便对接后端
      if (loginData && loginData.code) {
        console.log('[Login] tt.login code:', loginData.code);
      }
      isDouyinLogin = loginData.isLogin;
    } catch (err) {
      console.error('抖音登录失败:', err);
      if (typeof tt !== 'undefined') {
        tt.showToast({
          icon: 'fail',
          title: '开发者取消登录抖音',
        });
      }
      return false;
    }
    
    if (isDouyinLogin && loginData && loginData.code) {
      try {
        // 与开发者服务端交互，进行登录
        await this.loginToDeveloperServer(loginData.code);
        isDeveloperServerLogin = true;
        return true;
      } catch (err) {
        console.error('开发者服务端登录失败:', err);
        if (typeof tt !== 'undefined') {
          tt.showToast({
            title: '授权登录失败',
            icon: 'fail',
          });
        }
        return false;
      }
    }
    
    return isDouyinLogin;
  }

  /**
   * @description: 请求开发者服务端，做code2session
   * @param {string} code tt.login返回的code
   * @return {*}
   */
  async loginToDeveloperServer(code) {
    try {
      // 只在抖音小程序环境中显示加载提示
      if (typeof tt !== 'undefined') {
        tt.showLoading({
          title: '正在登录...',
        });
		// console.log('1')
      }
      // console.log(code)
      const res = await request({
        url: '/user/login',
        method: 'POST',
		header: {  // 明确添加请求头
		    'Content-Type': 'application/json'
		  },
        data: {
          'code':code,
        },
      });
   //    console.log(2);
	  // console.log(res);
      if (res.data && res.data.code === 1) {
        // 登录成功，保存数据
        this._token = res.data.data.token;
        this._openid = res.data.data.openid;
        this._userId = res.data.data.userId;
        
        // 只在抖音小程序环境中保存到本地存储（去除写死token）
        if (typeof tt !== 'undefined') {
          tt.setStorageSync('token', this._token);
          tt.setStorageSync('openid', this._openid);
          tt.setStorageSync('userId', this._userId);
        }
        // 注：以下为原先的“写死 token”代码，保留为注释，必要时可恢复用于本地联调
        // {
        //   tt.setStorageSync('token', 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3NTgxMjYzMTIsInVzZXJJZCI6MX0.giBiY8zzt0pK6aOe8HdNxvEZegAf2xdiC77Ux-j3z6c');
        //   tt.setStorageSync('openid', res.data.data.openid);
        //   tt.setStorageSync('userId', res.data.data.userId);
        // }
        
        console.log('[Login] 用户登录成功 → userId:', this._userId, 'openid:', this._openid);
        console.log('[Login] token 已写入本地存储');
      } else {
        throw new Error(res.data.msg || '登录失败');
      }
    } catch (err) {
      console.error('登录请求失败:', err);
      throw err;
    } finally {
      // 只在抖音小程序环境中隐藏加载提示
      if (typeof tt !== 'undefined') {
        tt.hideLoading();
      }
    }
  }

  /**
   * @description: 登出开发者服务端
   * @return {*}
   */
  async logout() {
    try {
      await request({
        url: '/user/logout',
        method: 'POST',
        data: {
          token: this.getToken(),
        },
      });
    } catch (err) {
      console.error('登出失败:', err);
    } finally {
      // 清除本地状态
      isDeveloperServerLogin = false;
      this._token = '';
      this._openid = '';
      this._userId = '';
      
      // 只在抖音小程序环境中清除存储
      if (typeof tt !== 'undefined') {
        tt.removeStorageSync('token');
        tt.removeStorageSync('openid');
        tt.removeStorageSync('userId');
      }
    }
  }

  /**
   * @description: 返回是否登录抖音主端
   * @return {*}
   */
  isDouyinLogin() {
    return isDouyinLogin;
  }

  /**
   * @description: 是否登录开发者服务端
   * @return {*}
   */
  isDeveloperServerLogin() {
    return isDeveloperServerLogin;
  }
  
  /**
   * @description: 获取localStorage中的token
   * @return {string}
   */
  getToken() {
    // 旧：固定返回演示 token（已弃用，保留以便需要时恢复）
    // return 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3NTgxMjYzMTIsInVzZXJJZCI6MX0.giBiY8zzt0pK6aOe8HdNxvEZegAf2xdiC77Ux-j3z6c';
    return this._token || (typeof tt !== 'undefined' ? tt.getStorageSync('token') : '');
  }

  /**
   * @description: 获取localStorage中的openid
   * @return {string}
   */
  getOpenid() {
    if (typeof tt === 'undefined') {
      return this._openid;
    }
    return this._openid || tt.getStorageSync('openid');
  }

  /**
   * @description: 获取localStorage中的userId
   * @return {string}
   */
  getUserId() {
    if (typeof tt === 'undefined') {
      return this._userId;
    }
    return this._userId || tt.getStorageSync('userId');
  }

  /**
   * @description: 检查登录状态，如果已登录则从本地存储恢复
   * @return {boolean}
   */
  checkLoginStatus() {
    // 检查是否在抖音小程序环境中
    if (typeof tt === 'undefined') {
      console.log('不在抖音小程序环境中，跳过登录状态检查');
      return false;
    }
    
    try {
      // 旧：使用演示 token 判断已登录（已弃用，保留注释）
      // const token = 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3NTgxMjYzMTIsInVzZXJJZCI6MX0.giBiY8zzt0pK6aOe8HdNxvEZegAf2xdiC77Ux-j3z6c';
      const token = tt.getStorageSync('token');
      const openid = tt.getStorageSync('openid');
      const userId = tt.getStorageSync('userId');
      const demoToken = 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3NTgxMjYzMTIsInVzZXJJZCI6MX0.giBiY8zzt0pK6aOe8HdNxvEZegAf2xdiC77Ux-j3z6c';
      const validToken = token && token !== demoToken;
      
      if (validToken && openid && userId) {
        this._token = token;
        this._openid = openid;
        this._userId = userId;
        isDeveloperServerLogin = true;
        return true;
      }
      if (!validToken && token) {
        // 清理演示token，避免误判
        try { tt.removeStorageSync('token') } catch(e) {}
      }
    } catch (error) {
      console.error('检查登录状态失败:', error);
    }
    
    return false;
  }

  /**
   * @description: 静默登录，不显示加载提示
   * @return {boolean}
   */
  async silentLogin() {
    if (isDeveloperServerLogin) {
      return true;
    }
    
    // 先检查本地存储
    if (this.checkLoginStatus()) {
      return true;
    }
    
    // 检查是否在抖音小程序环境中
    if (typeof tt === 'undefined') {
      console.log('不在抖音小程序环境中，跳过静默登录');
      return false;
    }
    
    try {
      // 静默调用tt.login
      const loginData = await promisify(tt.login, { force: false });
      if (loginData && loginData.code) {
        console.log('[SilentLogin] tt.login code:', loginData.code);
      }
      isDouyinLogin = loginData.isLogin;
      
      if (isDouyinLogin && loginData && loginData.code) {
        await this.loginToDeveloperServer(loginData.code);
        isDeveloperServerLogin = true;
        return true;
      }
    } catch (err) {
      console.error('静默登录失败:', err);
    }
    
    return false;
  }
}

export const loginController = new LoginController();
